using System.Collections.Generic;
using M0;
using UnityEngine;

namespace M1
{
    public class Task管理器 : BaseSingleMono<Task管理器>
    {
        private const string Task管理器Key = "Task管理器Key";
        [SerializeField]private 任务缓存 Datas;

        private void Start()
        {
            Datas = 任务缓存.Instance.GetData();
        }


        public List<任务进度> Get进行中的任务(bool is完成)
        {
            List<任务进度> res = new List<任务进度>();
            if (Datas == null)
            {
                return res;
            }
            
            foreach (var VARIABLE in Datas.进行中的任务)
            {
                if (VARIABLE.完成 == is完成)
                {
                    res.Add(VARIABLE);
                }
            }
            return res;
        }

    
        private 任务进度 接受任务配置_任务进度(BaseTaskData config)
        {
            任务进度 n = new 任务进度();
            n.Id = config.Id;
            n.任务目标 = config.任务目标;
            n.完成进度 = 0;
            n.任务类型 = config.任务类型;
            n.任务子类型 = config.任务子类型;
            return n;
        }
    
        public void 接受任务(BaseTaskData config)
        {
            if (Datas == null) Datas = 任务缓存.Instance.GetData();
            
            int index = Datas.进行中的任务.FindIndex(f =>  f.Id == config.Id);
            if (index < 0)
            {
                Datas.进行中的任务.Add(接受任务配置_任务进度(config));
            }
            else
            {
                BDebug.Warn("已经领取过任务了");
            }
            M.Event.DoEvent(M.EventKey_接受任务,config.Id);
        }

        public void 增加任务进度(string 任务子类型,int value=1)
        {
            List<int> 完成任务 = new List<int>();
            foreach ( var VARIABLE in Datas.进行中的任务)
            {
                if (VARIABLE.任务子类型 == 任务子类型)
                {
                    VARIABLE.完成进度+=value;
                    if (VARIABLE.完成进度 >= VARIABLE.任务目标)
                    {
                        VARIABLE.完成 = true;
                        完成任务.Add(VARIABLE.Id);
                               
                    }
                    else
                    {
                        M.Event.DoEvent(M.EventKey_更新任务,(VARIABLE.Id,VARIABLE.任务目标,VARIABLE.完成进度));
                    }
                }
            }

            foreach (var VARIABLE in 完成任务)
            {
                M.Event.DoEvent(M.EventKey_完成任务,VARIABLE);
            }
        }

        public void 领奖奖励(int 任务Id)
        {
            int index = Datas.进行中的任务.FindIndex(f=> f.Id == 任务Id);
            if (index >= 0)
            {
                Datas.进行中的任务[index].完成 = true;
                Datas.及时保存数据();
            }
        }
    }

}


public class BaseTaskData
{
    public int Id;
    public int 任务目标;
    public TaskType 任务类型;
    public string 任务描述;
    public string 任务子类型;
}


